<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * User Controller
 **/
class User extends Public_Controller
{
	public function __construct()
	{
		parent::__construct();
	}

	public function index()
	{
	}
	
	/**
	 * Facebook connect
	 */
	public function fconnect()
	{
		$accessToken = $this->input->post('accessToken');

		// LOAD FACEBOOK LIBRARY
        $config = array(
            'appId' => setting('app', 'id'),
            'secret' => setting('app', 'secret')
        );

        $this->load->library('facebook/facebook', $config);

		try
		{
			// client 'dan gelen access token ile mevcut kullanıcının bilgilerini çekiyoruz
			$udata = $this->facebook->api('/me', 'GET', array('access_token' => $accessToken));

			$uid = $udata['id'];

			// e posta adresi ile kullanıcıyı veritabanımızdan çekmeyi deneyeceğiz varsa 
			// bilgileri güncelleyeceğiz yoksa yeni kayıt yapacağız.
			$q = $this->db->get_where('user', array('email' => $udata['email']));

			// kullanıcı daha önce kayıt edilmiş, Güncelle
			if($q->num_rows() > 0)
			{
				$userData = $q->row();
				
				// varsa güncelle
				$this->db->update('user', array('fb_user_id' => $uid), array('id' => $userData->id));
				
				$this->auth->establish_session($userData);
				$this->auth->update_last_login($userData->id);
			} 
			// Kullanıcı daha önce kayıt edilmemiş, Yeni kayıt
			else
			{
				// facebook tan aldığımız ham veriyi kullanılabilir hale getiriyoruz
				$data = $this->auth->prepare_facebook_data($udata);
				// kullanıcıyı kayıt ediyoruz ve peşinden login ediyoruz.
				$this->auth->register($data, array('after_login' => true));
			}
		}
		// kullanıcının bilgilerini çekemedik
		// muhtemelen giriş başarısız oldu o yüzden kullanıcıyı login etmiyoruz.
		catch(FacebookApiException $e)
		{
			ajax_response("Giriş Başarısız");
		}
       
		ajax_response("Giriş Başarılı", FALSE);
	}
	
	public function login()
	{
		if (empty($_POST))
		{
			$this->template->load('user/login');
		}
		else
		{
			if (!$this->auth->login($this->input->post('email'), $this->input->post('password')))
			{
				$json = array('error' => TRUE, 'msg' => $this->auth->errors());
				exit(json_encode($json));
			}

			// CONTINUE
			$msg = 'Sisteme başarıyla giriş yaptınız.';
			set_notify($msg);

			$redirect = ($this->session->userdata('redirect')) ? $this->session->userdata('redirect') : site_url('main/index');

			ajax_response(NULL, FALSE, $redirect);
		}
	}

	public function logout()
	{
		$this->auth->logout();
		redirect('user/login');
	}

	public function register()
	{
		if (empty($_POST))
		{
			$this->template->load('user/register');
		}
		else
		{
			// VALIDATION
			$this->load->library('form_validation');
			$this->form_validation->set_rules('email', 'E-Posta', 'trim|required|valid_email|callback__checkEmail');
			$this->form_validation->set_rules('password', 'Şifre', 'trim|required|min_length[4]|matches[passwordconf]');
			$this->form_validation->set_rules('passwordconf', 'Şifre Tekrarı', 'trim|required');

			if (!$this->form_validation->run())
			{
				ajax_response($this->form_validation->error_string());
			}

			// CONTINUE
			$data = array(
				'main_data' => array(
					'email' => $this->input->post('email'), 
					'password_hash' => $this->input->post('password')
				)
			);

			$options = array('after_login' => TRUE);
			$uid = $this->auth->register($data, $options);

			// Send welcome email
			$this->postman->welcome($uid);
			
			$msg = 'Kayıt işleminiz başarıyla tamamlanmıştır.';
			set_notify($msg);

			$redirect = ($this->session->flashdata('redirect')) ? $this->session->flashdata('redirect') : site_url('main/index');

			ajax_response(NULL, FALSE, $redirect);
		}
	}

	public function detail($uid)
	{
		// user
		$user = $this->user_model->get(array('id' => $uid));

		// DATA
		$data = array('user' => $user);

		$this->template->load('user/detail', $data);
	}

	public function edit_account()
	{
		$this->auth->require_login();

		if (empty($_POST))
		{
			// user
			$user = $this->user_model->simple_get($this->auth->uid());

			// DATA
			$data = array('user' => $user);

			$this->template->load_partial('user/edit_account', $data);
		}
		else
		{
			// VALIDATION
			$this->load->library('form_validation');
			$this->form_validation->set_rules('email', 'E-Posta', 'trim|required|valid_email|callback__checkEmail3');

			// if changed password
			if (isset($_POST['change_password']))
			{
				$this->form_validation->set_rules('password', 'Şifre', 'trim|required|matches[passwordconf]');
				$this->form_validation->set_rules('passwordconf', 'Şifre Tekrarı', 'trim|required');
			}

			if (!$this->form_validation->run())
			{
				ajax_response($this->form_validation->error_string());
			}

			// CONTINUE

			$data = array('email' => $this->input->post('email'));

			if (isset($_POST['change_password']))
			{
				$salt = $this->auth->generate_salt();
				$password_hash = do_hash($salt . $this->input->post('password'));
				
				$data['salt'] = $salt;
				$data['password_hash'] = $password_hash;
			}

			$this->user_model->edit($data, array('id' => $this->auth->uid()));

			// kullanıcının oturumununun sonlanmaması için sessiondaki eski değerler yenileri
			// ile güncelleniyor.
			$user = $this->user_model->simple_get($this->auth->uid());
			$this->auth->establish_session($user);

			ajax_response("İşlem başarıyla tamamlandı");
		}
	}

	public function edit_profile()
	{
		$this->auth->require_login();

		$this->load->model('user_profile_model');

		if (empty($_POST))
		{
			// user
			$user = $this->user_profile_model->get($this->auth->uid());

			// DATA
			$data = array('user' => $user);

			$this->template->load_partial('user/edit_profile', $data);
		}
		else
		{
			// VALIDATION
			$this->load->library('form_validation');
			$this->form_validation->set_rules('firstname', 'Adınız', 'trim|xss_clean|max_length[255]');
			$this->form_validation->set_rules('lastname', 'Soyadınız', 'trim|xss_clean|max_length[255]');
			$this->form_validation->set_rules('company', 'Şirket', 'trim|xss_clean|max_length[255]');
			$this->form_validation->set_rules('telephone', 'Telefon', 'trim|numeric|exact_length[10]');

			if (!$this->form_validation->run())
			{
				ajax_response($this->form_validation->error_string());
			}

			// CONTINUE

			$this->user_profile_model->edit($_POST, array('user_id' => $this->auth->uid()));

			ajax_response('İşlem Başarıyla Tamamlandı.', FALSE);
		}
	}

	public function forgot_password()
	{
		if (empty($_POST))
		{
			$data = array();

			$this->template->load_partial('user/forgot_password', $data);
		}
		else
		{
			// VALIDATIONS
			$this->load->library('form_validation');
			$this->form_validation->set_rules('email', 'E-posta', 'trim|required|valid_email|callback__checkEmail2');

			if (!$this->form_validation->run())
			{
				ajax_response($this->form_validation->error_string());
			}

			// CONTINUE
			$this->load->model('forgotpassword_model');

			// get user data
			$user = $this->user_model->get(array('email' => $this->input->post('email')));

			// add forgot_password table
			$this->load->helper('string');
			$code = random_string('alnum', 12);
			$data = array('user_id' => $user->id, 'code' => $code);

			$id = $this->forgotpassword_model->add($data);
			
			// SEND EMAIL
			$this->postman->forgot_password($id);
			
			ajax_response("Şifre sıfırlama kodunuz <strong>{$user->email}</strong> adresine gönderilmiştir. Lütfen Mail kutunuzu kontrol ediniz", FALSE);
		}
	}

	public function reset_password()
	{
		if (empty($_POST))
		{
			$code = $this->input->get('code');
			$data = array('code' => $code);

			$this->template->load('user/reset_password', $data);
		}
		else
		{
			$this->load->model('forgotpassword_model');

			// VALIDATIONS
			$this->load->library('form_validation');
			$this->form_validation->set_rules('password', 'Şifre', 'trim|required|min_length[4]|matches[passwordconf]');
			$this->form_validation->set_rules('passwordconf', 'Şifre Tekrarı', 'trim|required');
			$this->form_validation->set_rules('code', 'Kod', 'trim|callback__checkCode');

			if (!$this->form_validation->run())
			{
				ajax_response($this->form_validation->error_string());
			}

			// CONTINUE
			$this->load->helper('security');

			$user_id = $this->forgotpassword_model->get($this->input->post('code'))->user_id;

			$salt = $this->auth->generate_salt();
			$password_hash = do_hash($salt . $this->input->post('password'));

			$data = array('salt' => $salt, 'password_hash' => $password_hash);
			$this->user_model->edit($data, array('id' => $user_id));

			$msg = 'Şifre sıfırlama işleminiz başarıyla tamamlanmıştır. Şimdi yeni şifreniz ile aşağıdaki formdan giriş yapabilirsiniz.';
			set_notify($msg);

			ajax_response(NULL, FALSE, site_url("user/login"));
		}
	}

	/**
	 * ----------------------------------------------------------------------
	 * CALLBACKS
	 * ----------------------------------------------------------------------
	 */

	/**
	 * E posta adresinin sistemde var olup olmadığını kontrol eder.
	 * Kullanıldığı yerler: register();
	 *
	 * @param string
	 * @return bool
	 */
	public function _checkEmail($email)
	{
		$result = $this->user_model->has(array('email' => $email));

		if ($result)
		{
			$this->form_validation->set_message('_checkEmail', 'Bu e posta adresi sistemde zaten kayıtlı. Lütfen farklı bir e-posta adresi giriniz');
			return FALSE;
		}

		return TRUE;
	}

	/**
	 * e posta adresinin sistemde var olup olmadığını kontrol eder.
	 * Kullanıldığı yerler: forgot_password()
	 *
	 * @param string
	 * @return bool
	 */
	public function _checkEmail2($email)
	{
		$result = $this->user_model->has(array('email' => $email));

		if (!$result)
		{
			$this->form_validation->set_message('_checkEmail2', 'Sistemimizde bu e-posta adresi ile kayıtlı herhangi bir üye bulanamadı.');
			return FALSE;
		}

		return TRUE;
	}

	/**
	 * e posta adresinin sistemde var olup olmadığını kontrol eder.
	 * Kullanıldığı yerler: edit_account()
	 *
	 * @param string
	 * @return bool
	 */
	public function _checkEmail3($email)
	{
		$result = $this->user_model->has(array('email' => $email, 'exceptId' => $this->auth->uid()));

		if ($result > 0)
		{
			$this->form_validation->set_message('_checkEmail3', 'Bu e posta adresi sistemde zaten kayıtlı. Lütfen farklı bir e-posta adresi giriniz');
			return FALSE;
		}

		return TRUE;
	}

	/**
	 * Şifre sıfırlama kodunun doğruluğunu kontrol eder.
	 * Kullanıldığı yerler: reset_password_post()
	 *
	 * @param string
	 * @return bool
	 */
	public function _checkCode($code)
	{
		$result = $this->forgotpassword_model->get($code);

		if ($result === FALSE)
		{
			$this->form_validation->set_message('_checkCode', 'Geçersiz sıfırlama kodu');
			return FALSE;
		}

		return TRUE;
	}
}

/* End of file user.php */
